Quadrics
Quadrics sind eine Möglichkeit komplexe Objekte zu zeichen, die normalerweise mehrere FOR-Schleifen und einiges Hintergrundwissen in Trigonometrie benötigen würden.
Wir werden den Code aus Lektion sieben verwenden. Wir werden sieben Variablen hinzufügen und die Texturen ein wenig verändern um etwas Abwechslung hinein zu bringen :)
#include < windows.h> // Header Datei für Windows
#include < stdio.h> // Header Datei für Standard Eingabe/Ausgabe
#include < gl\gl.h> // Header Datei für die OpenGL32 Library
#include < gl\glu.h> // Header Datei für die GLu32 Library
#include < gl\glaux.h> // Header Datei für die GLaux Library
HDC hDC=NULL; // Privater GDI Device Context
HGLRC hRC=NULL; // Permanenter Rendering Context
HWND hWnd=NULL; // Enthält unser Fenster-Handle
HINSTANCE hInstance; // Enthält die Instanz der Applikation
bool keys[256]; // Array das für die Tastatur Routine verwendet wird
bool active=TRUE; // Fenster Aktiv Flag standardmäßig auf TRUE gesetzt
bool fullscreen=TRUE; // Fullscreen Flag ist standardmäßig auf TRUE gesetzt
bool light; // Beleuchtung AN/AUS
bool lp; // L gedrückt?
bool fp; // F gedrückt?
bool sp; // Leertaste gedrückt? ( NEU )
int part1; // Start der Disc ( NEU )
int part2; // Ende der Disc ( NEU )
int p1=0; // Increase 1 ( NEU )
int p2=1; // Increase 2 ( NEU )
GLfloat xrot; // X Rotation
GLfloat yrot; // Y Rotation
GLfloat xspeed; // X Rotation Geschwindigkeit
GLfloat yspeed; // Y Rotation Geschwindigkeit
GLfloat z=-5.0f; // Tiefe in den Bildschirm
GLUquadricObj *quadratic; // Speicher für unsere Quadratic Objecte ( NEU )
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; // Ambiente Licht Werte
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // Diffuse Licht Werte
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f }; // Licht Position
GLuint filter; // Welcher Filter benutzt werden soll
GLuint texture[3]; // Speicher für 3 Texturen
GLuint object=0; // Welches Object gezeichnet werden soll ( NEU )
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Deklaration für WndProc
quadratic=gluNewQuadric(); // erzeugt einen Zeiger auf das Quadric Obkect ( NEU ) gluQuadricNormals(quadratic, GLU_SMOOTH); // erzeugt Normalen ( NEU ) gluQuadricTexture(quadratic, GL_TRUE); // erzeugt Textur Koordinaten ( NEU )
GLvoid glDrawCube() // Zeichne einen Würfel
{
glBegin(GL_QUADS); // Beginne Qudrate zu zeichnen
// Front Face
glNormal3f( 0.0f, 0.0f, 1.0f); // Normalen die forwärts zeigen
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Unten Links der Textur und des Qudrats
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Unten rechts der Textur und des Qudrats
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Oben rechts der Textur und des Qudrats
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Oben Links der Textur und des Qudrats
// Back Face
glNormal3f( 0.0f, 0.0f,-1.0f); // Normal Facing Away
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Unten rechts der Textur und des Qudrats
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Oben rechts der Textur und des Qudrats
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Oben Links der Textur und des Qudrats
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Unten Links der Textur und des Qudrats
// Top Face
glNormal3f( 0.0f, 1.0f, 0.0f); // Normal Facing Up
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Oben Links der Textur und des Qudrats
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Unten Links der Textur und des Qudrats
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Unten rechts der Textur und des Qudrats
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Oben rechts der Textur und des Qudrats
// Bottom Face
glNormal3f( 0.0f,-1.0f, 0.0f); // Normal Facing Down
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Oben rechts der Textur und des Qudrats
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Oben Links der Textur und des Qudrats
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Unten Links der Textur und des Qudrats
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Unten rechts der Textur und des Qudrats
// Right face
glNormal3f( 1.0f, 0.0f, 0.0f); // Normal Facing Right
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Unten rechts der Textur und des Qudrats
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Oben rechts der Textur und des Qudrats
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Oben Links der Textur und des Qudrats
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Unten Links der Textur und des Qudrats
// Left Face
glNormal3f(-1.0f, 0.0f, 0.0f); // Normal Facing Left
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Unten Links der Textur und des Qudrats
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Unten rechts der Textur und des Qudrats
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Oben rechts der Textur und des Qudrats
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Oben Links der Textur und des Qudrats
glEnd(); // Done Drawing Quads
}
int DrawGLScene(GLvoid) // Hier kommt der ganze Zeichnen-Kram hin
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Löscht den Bildschirm und den Depth-Buffer
glLoadIdentity(); // Resettet die Ansicht (View)
glTranslatef(0.0f,0.0f,z); // In den Bildschirm hineinbewegen
glRotatef(xrot,1.0f,0.0f,0.0f); // Rotiere auf der X-Achse
glRotatef(yrot,0.0f,1.0f,0.0f); // Rotiere auf der X-Achse
glBindTexture(GL_TEXTURE_2D, texture[filter]); // Wähle eine Filter-Textur
// Dieser Code-Ausschnitt ist neu ( NEU )
switch(object) // Überprüfe object um herauszufinden, was gezeichnet werden soll
{
case 0: // Zeichne Objekt 1
glDrawCube(); // Zeichne unseren Würfel
break; // Fertig
case 1: // Zeichne Objekt 2 glTranslatef(0.0f,0.0f,-1.5f); // Zentriere den Zylinder gluCylinder(quadratic,1.0f,1.0f,3.0f,32,32); // Zeichne unseren Zylinder break; // Fertig
case 2: // Zeichne Objekt 3 gluDisk(quadratic,0.5f,1.5f,32,32); // Zeichne eine Disc (CD Form) break; // Fertig
case 3: // Zeichne Objekt 4 gluSphere(quadratic,1.3f,32,32); // Zeichne eine Sphere break; // Fertig
case 4: // Zeichne Objekt 5 glTranslatef(0.0f,0.0f,-1.5f); // Zentriere den Kegel gluCylinder(quadratic,1.0f,0.0f,3.0f,32,32); // Ein Kegel mit unterem Raidus von 0.5f und einer Höhe von 2 break; // Fertig
case 5: // Zeichne Objekt 6
part1+=p1; // Inkrementiere Start-Winkel
part2+=p2; // Inkrementiere Sweep-Winkel
if(part1>359) // 360 Grad
{
p1=0; // Stoppe mit der Inkrementierung des Anfangs-Winkels
part1=0; // Setze Anfangs-Winkel auf 0
p2=1; // Beginne mit der Inkrementierung des Sweep-Winkels
part2=0; // Starte Sweep-Winkel bei 0
}
if(part2>359) // 360 Grad
{
p1=1; // Starte Inkrementierung des Anfangs-Winkel
p2=0; // Stoppe Inkrementierung des Sweep-Winkels
}
gluPartialDisk(quadratic,0.5f,1.5f,32,32,part1,part2-part1); // Eine Disk wie die davor
break; // Fertig
};
xrot+=xspeed; // Inkrementiere Rotation auf der X-Achse
yrot+=yspeed; // Inkrementiere Rotation auf der Y-Achse
return TRUE; // Weiter geht's
}
GLvoid KillGLWindow(GLvoid) // Entferne das Fenster korrekt
{
gluDeleteQuadric(quadratic); // Lösche Quadratic - Gebe Ressourcen wieder frei
if (keys[' '] && !sp) // Wurde die Leertaste gedrückt?
{
sp=TRUE; // Wenn ja, setze sp auf TRUE
object++; // wechsle durch die Objekte
if(object>5) // Ist object größer als 5?
object=0; // Wenn ja, dann auf 0 setzen
}
if (!keys[' ']) // Wurde die Leertaste wieder losgelassen
{
sp=FALSE; // Wenn ja, dann setze sp auf FALSE
}